{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "134e7f9d",
   "metadata": {},
   "source": [
    "# Hello, KAN!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "59cf5cd0",
   "metadata": {},
   "source": [
    "### Kolmogorov-Arnold representation theorem"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f88e5321",
   "metadata": {},
   "source": [
    "Kolmogorov-Arnold representation theorem states that if $f$ is a multivariate continuous function\n",
    "on a bounded domain, then it can be written as a finite composition of continuous functions of a\n",
    "single variable and the binary operation of addition. More specifically, for a smooth $f : [0,1]^n \\to \\mathbb{R}$,\n",
    "\n",
    "\n",
    "$$f(x) = f(x_1,...,x_n)=\\sum_{q=1}^{2n+1}\\Phi_q(\\sum_{p=1}^n \\phi_{q,p}(x_p))$$\n",
    "\n",
    "where $\\phi_{q,p}:[0,1]\\to\\mathbb{R}$ and $\\Phi_q:\\mathbb{R}\\to\\mathbb{R}$. In a sense, they showed that the only true multivariate function is addition, since every other function can be written using univariate functions and sum. However, this 2-Layer width-$(2n+1)$ Kolmogorov-Arnold representation may not be smooth due to its limited expressive power. We augment its expressive power by generalizing it to arbitrary depths and widths."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ebd8766a",
   "metadata": {},
   "source": [
    "### Kolmogorov-Arnold Network (KAN)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2cf3b1ee",
   "metadata": {},
   "source": [
    "The Kolmogorov-Arnold representation can be written in matrix form\n",
    "\n",
    "$$f(x)={\\bf \\Phi}_{\\rm out}\\circ{\\bf \\Phi}_{\\rm in}\\circ {\\bf x}$$\n",
    "\n",
    "where \n",
    "\n",
    "$${\\bf \\Phi}_{\\rm in}= \\begin{pmatrix} \\phi_{1,1}(\\cdot) & \\cdots & \\phi_{1,n}(\\cdot) \\\\ \\vdots & & \\vdots \\\\ \\phi_{2n+1,1}(\\cdot) & \\cdots & \\phi_{2n+1,n}(\\cdot) \\end{pmatrix},\\quad {\\bf \\Phi}_{\\rm out}=\\begin{pmatrix} \\Phi_1(\\cdot) & \\cdots & \\Phi_{2n+1}(\\cdot)\\end{pmatrix}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f6521452",
   "metadata": {},
   "source": [
    "We notice that both ${\\bf \\Phi}_{\\rm in}$ and ${\\bf \\Phi}_{\\rm out}$ are special cases of the following function matrix ${\\bf \\Phi}$ (with $n_{\\rm in}$ inputs, and $n_{\\rm out}$ outputs), we call a Kolmogorov-Arnold layer:\n",
    "\n",
    "$${\\bf \\Phi}= \\begin{pmatrix} \\phi_{1,1}(\\cdot) & \\cdots & \\phi_{1,n_{\\rm in}}(\\cdot) \\\\ \\vdots & & \\vdots \\\\ \\phi_{n_{\\rm out},1}(\\cdot) & \\cdots & \\phi_{n_{\\rm out},n_{\\rm in}}(\\cdot) \\end{pmatrix}$$\n",
    "\n",
    "${\\bf \\Phi}_{\\rm in}$ corresponds to $n_{\\rm in}=n, n_{\\rm out}=2n+1$, and ${\\bf \\Phi}_{\\rm out}$ corresponds to $n_{\\rm in}=2n+1, n_{\\rm out}=1$."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b410498",
   "metadata": {},
   "source": [
    "After defining the layer, we can construct a Kolmogorov-Arnold network simply by stacking layers! Let's say we have $L$ layers, with the $l^{\\rm th}$ layer ${\\bf \\Phi}_l$ have shape $(n_{l+1}, n_{l})$. Then the whole network is\n",
    "\n",
    "$${\\rm KAN}({\\bf x})={\\bf \\Phi}_{L-1}\\circ\\cdots \\circ{\\bf \\Phi}_1\\circ{\\bf \\Phi}_0\\circ {\\bf x}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "54bbde9a",
   "metadata": {},
   "source": [
    "In constrast, a Multi-Layer Perceptron is interleaved by linear layers ${\\bf W}_l$ and nonlinearities $\\sigma$:\n",
    "\n",
    "$${\\rm MLP}({\\bf x})={\\bf W}_{L-1}\\circ\\sigma\\circ\\cdots\\circ {\\bf W}_1\\circ\\sigma\\circ {\\bf W}_0\\circ {\\bf x}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1c5f7795",
   "metadata": {},
   "source": [
    "A KAN can be easily visualized. (1) A KAN is simply stack of KAN layers. (2) Each KAN layer can be visualized as a fully-connected layer, with a 1D function placed on each edge. Let's see an example below."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "adcb5f75",
   "metadata": {},
   "source": [
    "### Get started with KANs"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2571d531",
   "metadata": {},
   "source": [
    "Initialize KAN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "2075ef56",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cpu\n",
      "checkpoint directory created: ./model\n",
      "saving model version 0.0\n"
     ]
    }
   ],
   "source": [
    "from kan import *\n",
    "torch.set_default_dtype(torch.float64)\n",
    "\n",
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "print(device)\n",
    "\n",
    "# create a KAN: 2D inputs, 1D output, and 5 hidden neurons. cubic spline (k=3), 5 grid intervals (grid=5).\n",
    "model = KAN(width=[2,5,1], grid=3, k=3, seed=42, device=device)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d72e076",
   "metadata": {},
   "source": [
    "Create dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "46717e8b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(torch.Size([1000, 2]), torch.Size([1000, 1]))"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from kan.utils import create_dataset\n",
    "# create dataset f(x,y) = exp(sin(pi*x)+y^2)\n",
    "f = lambda x: torch.exp(torch.sin(torch.pi*x[:,[0]]) + x[:,[1]]**2)\n",
    "dataset = create_dataset(f, n_var=2, device=device)\n",
    "dataset['train_input'].shape, dataset['train_label'].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c6add1d",
   "metadata": {},
   "source": [
    "Plot KAN at initialization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ac76f858",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x400 with 22 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot KAN at initialization\n",
    "model(dataset['train_input']);\n",
    "model.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ddf67e30",
   "metadata": {},
   "source": [
    "Train KAN with sparsity regularization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "97111d75",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "| train_loss: 1.85e-02 | test_loss: 1.77e-02 | reg: 6.93e+00 | : 100%|█| 50/50 [00:09<00:00,  5.13it"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.1\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "# train the model\n",
    "model.fit(dataset, opt=\"LBFGS\", steps=50, lamb=0.001);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f30c3ab",
   "metadata": {},
   "source": [
    "Plot trained KAN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "92a4f67a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x400 with 22 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "576856cf",
   "metadata": {},
   "source": [
    "Prune KAN and replot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "7fe6fb12",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.2\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x400 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = model.prune()\n",
    "model.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd08ad99",
   "metadata": {},
   "source": [
    "Continue training and replot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "18a2db11",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "| train_loss: 1.79e-02 | test_loss: 1.72e-02 | reg: 7.66e+00 | : 100%|█| 50/50 [00:06<00:00,  7.21it"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.3\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "model.fit(dataset, opt=\"LBFGS\", steps=50);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "8768d56c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.4\n"
     ]
    }
   ],
   "source": [
    "model = model.refine(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "46f73098",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "| train_loss: 4.67e-04 | test_loss: 4.73e-04 | reg: 7.66e+00 | : 100%|█| 50/50 [00:06<00:00,  7.37it"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.5\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "model.fit(dataset, opt=\"LBFGS\", steps=50);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf35d505",
   "metadata": {},
   "source": [
    "Automatically or manually set activation functions to be symbolic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b3c0642b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fixing (0,0,0) with sin, r2=0.9999999188529035, c=2\n",
      "fixing (0,1,0) with x^2, r2=0.9999999809840728, c=2\n",
      "fixing (1,0,0) with exp, r2=0.9999999904907739, c=2\n",
      "saving model version 0.6\n"
     ]
    }
   ],
   "source": [
    "mode = \"auto\" # \"manual\"\n",
    "\n",
    "if mode == \"manual\":\n",
    "    # manual mode\n",
    "    model.fix_symbolic(0,0,0,'sin');\n",
    "    model.fix_symbolic(0,1,0,'x^2');\n",
    "    model.fix_symbolic(1,0,0,'exp');\n",
    "elif mode == \"auto\":\n",
    "    # automatic mode\n",
    "    lib = ['x','x^2','x^3','x^4','exp','log','sqrt','tanh','sin','abs']\n",
    "    model.auto_symbolic(lib=lib)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "821ba616",
   "metadata": {},
   "source": [
    "Continue training till machine precision"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "c0800415",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "| train_loss: 3.33e-10 | test_loss: 7.20e-11 | reg: 0.00e+00 | : 100%|█| 50/50 [00:02<00:00, 24.56it\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.7\n"
     ]
    }
   ],
   "source": [
    "model.fit(dataset, opt=\"LBFGS\", steps=50);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e39da499",
   "metadata": {},
   "source": [
    "Obtain the symbolic formula"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "bf44f7e0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 1.0 e^{1.0 x_{2}^{2} + 1.0 \\sin{\\left(3.1416 x_{1} \\right)}}$"
      ],
      "text/plain": [
       "1.0*exp(1.0*x_2**2 + 1.0*sin(3.1416*x_1))"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from kan.utils import ex_round\n",
    "\n",
    "ex_round(model.symbolic_formula()[0][0],4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "16e635f0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
